#ifndef __SOCKET_H__
#define __SOCKET_H__

#include <string>
using namespace std;

class Socket{

	public:
		Socket();
		Socket(int socket);
		Socket(const Socket & s);

		// Envia el string pasado por parametro. El string enviado se corresponde
		// 1 a 1 con un string recibido del otro lado del socket.
		// Si se envio exitosamente el string, retorna 0. En caso de que
		// se desconecte del cliente, retorna != 0.
		int sendS(const string & enviado);

		// Recibe un string. El string recibido se corresponde 1 a 1 con
		// un string enviado del otro lado del socket.
		int receiveS(string & recibido);

		// Cierra el socket.
		void closeS();

	protected:
		int fd;
};


class ServerSocket: public Socket{

	public:

		ServerSocket();

		// Prepara al socket para aceptar conexiones.
		// Si el socket queda listo para aceptar conexiones, retorna 0,
		// en caso contrario retorna != 0.
		int listenS(int port);

		// Acepta una conexion. Crea un nuevo socketCliente que manejara
		// el intercambio de informacion con el cliente.
		// Si la conexion se establece exitosamente, retorna 0, en caso
		// contrario retorna != 0.
		int acceptS(Socket & socketCliente);
};

class ClientSocket: public Socket{

	public:

		ClientSocket();

		// Conecta el socket al IP y puerto proporcionados.
		// Si la conexion tiene exito, retorna 0, en caso contrario retorna != 0.
		int connectS(string ip, int puerto);
};

#endif
